<?php

class TplOrdenTrabajo extends TPage {
//<editor-fold defaultstate="collapsed" desc="Constantes">
  const SESION_DATOS = "arr";
  const SESION_CACHE = "arrCache";
  //funciones pagina
  const FUNCION_VER = "Ver";
  const FUNCION_CREAR = "Crear";
  const FUNCION_ELIMINAR = "Eliminar";
  const FUNCION_REPLICAR_DATOS = "ReplicarDatos";
  //indices arreglo
  const ARRAY_DETALLE = 0;
  const ARRAY_ARCHIVOS = 1;

//</editor-fold>

//<editor-fold defaultstate="collapsed" desc="Metodos Privados">
  /**
   * obtiene los registros desde la base de datos
   * @author VSR, 05/12/2011
   */
  private function obtenerDatos() {
    try {
      $oUsuarioWf = Utilidades::obtenerSessionPorNombre(Usuario::NOMBRE_ENTIDAD);
      $idUsuario = $oUsuarioWf->getId();
      $nombrePagina = Utilidades::obtenerNombrePaginaActual($this);
      $idFlujo = $this->txtIdFlujo->Value;
      $idWorkflow = $this->txtIdWorkflow->Value;
      $arr = WfPlantillaOrdenTrabajo::obtenerDetalle($idFlujo, WfPlantillaOrdenTrabajo::NOMBRE_ENTIDAD_ARCHIVO, $idUsuario);
      Utilidades::grabarSessionPorNombre(self::SESION_DATOS . $nombrePagina, $arr);
    } catch (Exception $e) {
      throw new Exception($e->getMessage());
    }
  }

  /**
   * actualiza los controles de la pagina segun los datos obtenidos
   * @author VSR, 01/01/2011
   */
  private function actualizaInterfaz() {
    $totalRegistros = 0;
    $sb = new StringBuilder();
    try {
      $nombrePagina = Utilidades::obtenerNombrePaginaActual($this);
      $oUsuario = Utilidades::obtenerSessionPorNombre(Usuario::NOMBRE_ENTIDAD);
      $arr = Utilidades::obtenerSessionPorNombre(self::SESION_DATOS . $nombrePagina);

      //inicializa controles en vacio
      $idUsuario = $oUsuario->getId();
      $strNombreFlujo = "";
      $strNombreWorkflow = "";
      $strDepartamento = "";
      $strTipoOrdenTrabajo = "";
      $strFechaLlamado = "";
      $strDescripcion = "";
      $strNombrePersona = "";
      $strDireccion = "";
      $strTelefonoPersona = "";
      $strObservacion = "";
      $strNombreAsignado = "";
      $strPaternoAsignado = "";
      $strMaternoAsignado = "";
      $strFechaServicio = "";
      $strHoraServicio = "00";
      $strMinutosServicio = "00";
      $idEstadoOrdenTrabajo = "";
      $strPorcentajeAprobacion = "0";
      $idArchivo1 = "0";
      $strNombreArchivo1 = "";
      $strContentType1 = "";
      $strExtension1 = "";
      $intTamano1 = 0;
      $idFlujo = $this->txtIdFlujo->Value;
      $idPaso = $this->txtIdPaso->Value;
      $idWorkflow = $this->txtIdWorkflow->Value;
      $idCache = $this->txtIdCache->Value;
      $idHistorial = $this->txtIdHistorial->Value;
      $replicarDatos = $this->txtReplicarDatos->Value;
      $idEmpresa = $this->txtIdEmpresa->Value;
      $cargarFiltrosSesion = $this->txtCargarFiltrosSesion->Value;
      $paginaFiltro = $this->txtPaginaFiltro->Value;
      $idFlujoEstado = 0;
      $tipoFlujoEstado = "";
      $idUltimoHistorial = "0";
      $esEncargado = "0";
      $valorPlazoTotal = "";
      $unidadMedidaPlazoTotal = "";
      $diferenciaEnMinutos = "0";
      $themeBaseUrl = $this->txtThemeBaseUrl->Value;

      if (!is_null($arr)) {
        $arrDetalle = $arr[self::ARRAY_DETALLE];
        $totalRegistros = count($arrDetalle);
        if ($totalRegistros > 0) {
          $row = $arrDetalle[0];
          $strNombreWorkflow = $row["NombreWorkflow"];
          $strNombreFlujo = $row["NombreFlujo"];
          $strDepartamento = $row["Departamento"];
          $strTipoOrdenTrabajo = $row["TipoOrdenTrabajo"];
          $strFechaLlamado = $row["FechaLlamado"];
          $strDescripcion = $row["Descripcion"];
          $strNombrePersona = $row["NombrePersona"];
          $strDireccion = $row["Direccion"];
          $strTelefonoPersona = $row["TelefonoPersona"];
          $strObservacion = $row["Observacion"];
          $strNombreAsignado = $row["NombreAsignado"];
          $strPaternoAsignado = $row["PaternoAsignado"];
          $strMaternoAsignado = $row["MaternoAsignado"];
          $strFechaServicio = $row["FechaServicio"];
          $strHoraServicio = $row["HoraServicio"];
          $strMinutosServicio = $row["MinutosServicio"];
          $idEstadoOrdenTrabajo = $row["IdEstadoOrdenTrabajo"];
          $strPorcentajeAprobacion = $row["PorcentajeAprobacion"];
          $idFlujoEstado = $row["IdFlujoEstado"];
          $tipoFlujoEstado = $row["TipoFlujoEstado"];
          $idUltimoHistorial = $row["IdUltimoHistorial"];
          $esEncargado = $row["EsEncargado"];
          $valorPlazoTotal = $row["ValorPlazoTotal"];
          $unidadMedidaPlazoTotal = $row["UnidadMedidaPlazoTotal"];
          $diferenciaEnMinutos = $row["DiferenciaEnMinutos"];

          //obtiene datos de los archivos
          $arrArchivos = $arr[self::ARRAY_ARCHIVOS];
          $totalArchivos = count($arrArchivos);
          for($i = 0; $i <= $totalArchivos-1; $i++){
            $row = $arrArchivos[$i];
            $idArchivo1 = $row["IdArchivo"];
            $strNombreArchivo1 = $row["NombreArchivo"];
            $strContentType1 = $row["ContentType"];
            $strExtension1 = $row["Extension"];
            $intTamano1 = $row["Tamano"];
            $this->txtIdArchivo1->Value = $idArchivo1;
          }

        } else {
          $idFlujo = "0";
          $idPaso = "0";
          $idHistorial = "0";
        }
      }
    } catch (Exception $e) {
      $strNombreWorkflow = "";
      $strNombreFlujo = "";
      $strDepartamento = "";
      $strTipoOrdenTrabajo = "";
      $strFechaLlamado = "";
      $strDescripcion = "";
      $strNombrePersona = "";
      $strDireccion = "";
      $strTelefonoPersona = "";
      $strObservacion = "";
      $strNombreAsignado = "";
      $strPaternoAsignado = "";
      $strMaternoAsignado = "";
      $strFechaServicio = "";
      $strHoraServicio = "00";
      $strMinutosServicio = "00";
      $idEstadoOrdenTrabajo = "";
      $idArchivo1 = "0";
      $strNombreArchivo1 = "";
      $strContentType1 = "";
      $strExtension1 = "";
      $intTamano1 = 0;
      $strPorcentajeAprobacion = "0";
      $idFlujoEstado = 0;
      $tipoFlujoEstado = "";
      $idUltimoHistorial = "0";
      $esEncargado = "0";
      $valorPlazoTotal = "";
      $unidadMedidaPlazoTotal = "";
      $diferenciaEnMinutos = "0";
    }

    //obtiene valores del cache
    $arrCache = Utilidades::obtenerSessionPorNombre(self::SESION_CACHE.$nombrePagina);
    if ($esEncargado == "1") {
      $puedeAdjuntarArchivo = Utilidades::verificarPermisosEncargado($arrCache, WfPermiso::ADJUNTAR_ARCHIVOS);
      $puedeEditar = ($tipoFlujoEstado == "Termino") ? false : Utilidades::verificarPermisosEncargado($arrCache, WfPermiso::EDITAR);
    } else {
      $puedeAdjuntarArchivo = Utilidades::verificarPermisosPasos($arrCache, $idPaso, WfPermiso::ADJUNTAR_ARCHIVOS);
      $puedeEditar = ($tipoFlujoEstado == "Termino") ? false : Utilidades::verificarPermisosPasos($arrCache, $idPaso, WfPermiso::EDITAR);
    }
    $wucAprobacionActiva = ($idHistorial == $idUltimoHistorial);

    //obtiene nombre del workflow si esta vacio
    if(Utilidades::isNullOrEmpty($strNombreWorkflow)){
      $oWorkflow = new WfWorkflow();
      $oWorkflow->obtenerPorId($idWorkflow);
      $strNombreWorkflow = $oWorkflow->getNombre();
    }

    //obtiene atraso del flujo
    $diasAtraso = "";
    $classColorBarraProgreso = "";
    $classColorFondoBarraProgreso = "";
    $ordenPasoActual = Utilidades::obtenerOrdenPaso($arrCache, $idPaso);
    $totalPasos = Utilidades::obtenerTotalPasos($arrCache);
    $mensajeBarraProgreso = "[".$ordenPasoActual." de ".$totalPasos." ".( ($totalPasos == 1) ? "paso" : "pasos" )."]";

    if($idFlujoEstado == WfFlujoEstado::ESTADO_CANCELADO || $idFlujoEstado == WfFlujoEstado::ESTADO_RECHAZADO) {
      $classColorBarraProgreso = "wucbp-BarraProgesoGris";
      $classColorFondoBarraProgreso = "wucbp-BarraProgesoFondoGris";
    } else {
      $colorFlujo = Utilidades::obtenerColorFlujo($diferenciaEnMinutos, $valorPlazoTotal, $unidadMedidaPlazoTotal, $diasAtraso, "Flujo");
      if($colorFlujo == WfFlujo::COLOR_ROJO){
        $classColorBarraProgreso = "wucbp-BarraProgesoRojo";
        $classColorFondoBarraProgreso = "wucbp-BarraProgesoFondoRojo";
        $mensajeBarraProgreso = $diasAtraso."&nbsp;".$mensajeBarraProgreso;
      }
    }


    //asigna valores a los controles
    $this->lblTituloFormulario->Text = ($idFlujo == "0") ? "Crear"." ".$strNombreWorkflow : "Modificar"." ".$strNombreFlujo;
    $this->txtNombreWorkflow->Value = $strNombreWorkflow;
    $this->ddlDepartamento->asignarSelectedValue($strDepartamento);
    $this->ddlDepartamento->Enabled = ( $idFlujo == "0" ) ? true : false;
    $this->ddlTipoOrden->asignarSelectedValue($strTipoOrdenTrabajo);
    $this->ddlTipoOrden->Enabled = ( $idFlujo == "0" ) ? true : false;
    $this->txtFechaLlamado->Text = $strFechaLlamado;
    $this->txtFechaLlamado->Enabled = ( $idFlujo == "0" ) ? true : false;
    $this->txtDescripcion->Text = $strDescripcion;
    $this->txtDescripcion->Enabled = ( $idFlujo == "0" ) ? true : false;
    $this->txtNombre->Text = $strNombrePersona;
    $this->txtNombre->Enabled = ( $idFlujo == "0" ) ? true : false;
    $this->txtDireccion->Text = $strDireccion;
    $this->txtDireccion->Enabled = ( $idFlujo == "0" ) ? true : false;
    $this->txtTelefono->Text = $strTelefonoPersona;
    $this->txtTelefono->Enabled = ( $idFlujo == "0" ) ? true : false;
    $this->txtObservacion->Text = $strObservacion;
    $this->txtObservacion->Enabled = ( $idFlujo == "0" ) ? true : false;
    $this->txtNombreAsignado->Text = $strNombreAsignado;
    $this->txtNombreAsignado->Enabled = ($replicarDatos == "1") ? true : ( ( $idFlujo == "0" ) ? false : $puedeEditar );
    $this->txtPaternoAsignado->Text = $strPaternoAsignado;
    $this->txtPaternoAsignado->Enabled = ($replicarDatos == "1") ? true : ( ( $idFlujo == "0" ) ? false : $puedeEditar );
    $this->txtMaternoAsignado->Text = $strPaternoAsignado;
    $this->txtMaternoAsignado->Enabled = ($replicarDatos == "1") ? true : ( ( $idFlujo == "0" ) ? false : $puedeEditar );
    $this->txtFechaServicio->Text = $strFechaServicio;
    $this->txtFechaServicio->Enabled = ($replicarDatos == "1") ? true : ( ( $idFlujo == "0" ) ? false : $puedeEditar );
    $this->wucHora->asignarSelectedValueHora($strHoraServicio);
    $this->wucHora->asignarSelectedValueMinutos($strMinutosServicio);
    $this->wucHora->EnabledHora = ($replicarDatos == "1") ? true : ( ( $idFlujo == "0" ) ? false : $puedeEditar );
    $this->wucHora->EnabledMinutos = ($replicarDatos == "1") ? true : ( ( $idFlujo == "0" ) ? false : $puedeEditar );
    $this->ddlEstado->asignarSelectedValue($idEstadoOrdenTrabajo);
    $this->ddlEstado->Enabled = ($replicarDatos == "1") ? true : ( ( $idFlujo == "0" ) ? false : $puedeEditar );
    $this->pnlWucBarraProgreso->Visible = ( $idFlujo == "0" ) ? false : true;
    $this->pnlWucArchivo->Visible = ( $idFlujo == "0" ) ? false : $puedeAdjuntarArchivo;
    $this->pnlWucAprobacion->Visible = ( $idFlujo == "0" || $tipoFlujoEstado == "Termino" || $strNombreAsignado == "") ? false : true;
    $this->pnlAvisoAsignacion->Visible = ( $strNombreAsignado == "") ? true : false;
    $this->pnlWucHistorialAprobaciones->Visible = ( $idFlujo == "0" ) ? false : true;
    $this->pnlAdjuntarArchivos->Visible = ($replicarDatos == "1") ? true : ( ( $idFlujo == "0" ) ? false : ( ($idArchivo1 == "0") ? true : false ) );
    $this->pnlVerArchivos->Visible = false;
    $this->hBotonAplicar->Visible = ($tipoFlujoEstado == "Termino") ? false : ($puedeEditar || $puedeAdjuntarArchivo);
    $this->hBotonAceptar->Visible = ($tipoFlujoEstado == "Termino") ? false : ($puedeEditar || $puedeAdjuntarArchivo);

    $this->hBotonImprimir->Visible = ($tipoFlujoEstado == "Termino" && $idFlujoEstado == WfFlujoEstado::ESTADO_APROBADO) ? true : false;
    $this->txtEsEncargado->Value = $esEncargado;
    $this->lblCambiarImagen->Visible = ($replicarDatos == "1") ? true : false;
    $this->lblCampoObligatorioImagen->Visible = ($replicarDatos == "1") ? false : true;
    $this->hAsignadoControles->Visible = ($replicarDatos == "1") ? true : ( ( $idFlujo == "0" ) ? false : true);

    //setea valores wuc
    $this->wucAprobacion->NombreFlujo = $strNombreFlujo;
    $this->wucAprobacion->AprobacionActiva = $wucAprobacionActiva;
    $this->wucAprobacion->EsEncargado = $esEncargado;

    $this->wucArchivo->cargarDatos($idFlujo, WfFlujo::NOMBRE_ENTIDAD);
    if($tipoFlujoEstado == "Termino") {$this->wucArchivo->ModoPresentacion = "SoloLectura";}
    $this->wucBarraProgreso->Porcentaje = $strPorcentajeAprobacion;
    $this->wucBarraProgreso->Mensaje = $mensajeBarraProgreso;
    $this->wucBarraProgreso->CssClassColorDefecto = $classColorBarraProgreso;
    $this->wucBarraProgreso->CssClassColorFondoDefecto = $classColorFondoBarraProgreso;
    $this->wucHistorialAprobaciones->cargarDatos($idFlujo);

    if($this->hBotonReplicar->Visible){
      if($idFlujoEstado == WfFlujoEstado::ESTADO_CANCELADO || $idFlujoEstado == WfFlujoEstado::ESTADO_RECHAZADO) {
        $queryString = Utilidades::obtenerQueryStringFlujo(Utilidades::QUERYSTRING_FLUJO_NORMAL, "", $idFlujo, $idWorkflow, $idEmpresa, "0", $idCache, "0", "1",$cargarFiltrosSesion,$paginaFiltro);
        $this->hBotonReplicar->Visible = true;
        $this->btnReplicar->Attributes->Add("onclick", "return(validarReplicarDatosFlujo('".$nombrePagina."','".$queryString."',true))");
      } else {
        $this->hBotonReplicar->Visible = false;
      }
    }

    //construye ruta del archivo en el repositorio
    $idFlujoPadre = $idFlujo;
    if ($replicarDatos == "1") { $idFlujoPadre = $this->txtIdFlujoPadre->Value; }
    $entidad = WfPlantillaOrdenTrabajo::NOMBRE_ENTIDAD_ARCHIVO;

    //encripta el id
    $queryString = "{";
    $queryString .= " \"IdRegistro\":\"".$idFlujoPadre."\"";
    $queryString .= ",\"Entidad\":\"".$entidad."\"";
    $queryString .= ",\"IdArchivo\":\"{idArchivo}\"";
    $queryString .= ",\"NombreArchivo\":\"{nombreArchivo}\"";
    $queryString .= ",\"ContentType\":\"{contentType}\"";
    $queryString .= ",\"Descargable\":\"1\"";
    $queryString .= "}";

    if($idArchivo1 != "0") {
      $queryString1 = $queryString;
      $queryString1 = str_replace("{idArchivo}", $idArchivo1, $queryString1);
      $queryString1 = str_replace("{nombreArchivo}", $strNombreArchivo1, $queryString1);
      $queryString1 = str_replace("{contentType}", $strContentType1, $queryString1);
      $queryString1 = Criptografia::encriptarURL($queryString1);

      //asigna valores
      $this->pnlVerArchivos->Visible = true;
      $icono1 = Utilidades::obtenerRutaIconoTipoArchivo($strExtension1, $strContentType1, $themeBaseUrl);
      $this->lblArchivo1->Text = "<div style=\"padding-top:5px;\">".$icono1."&nbsp;&nbsp;<a href=\"index.php?page=Archivo.Visualizador&a=".$queryString1."\" class=\"cssTextoNormal\">".$strNombreArchivo1."&nbsp;&nbsp;(".Utilidades::convertirUnidadMedidaArchivo($intTamano1, true).")</a></div>";
    }

    //verifica si el usuario conectado es aprobador en el paso actual
    $esAprobadorPasoActual = Utilidades::esAprobadorPasoActual($arrCache, $idPaso, $idUsuario);
    if(!$esAprobadorPasoActual && $idFlujoEstado == WfFlujoEstado::ESTADO_PENDIENTE) {
      $this->convertirPlantillaSoloLectura();
    }

  }

  /**
   * inicializa algunos controles cuando se carga por primera vez la pagina
   * @param <type> $isPostBack
   * @author VSR, 01/01/2011
   */
  private function inicializaControles($isPostBack) {
    try {
      $nombrePagina = $this->obtenerNombrePagina();
      $estado = Utilidades::isNull(Utilidades::obtenerSessionPorNombre("Estado" . $nombrePagina), "");
      $cargarDesdePopUp = "0";
      $idFlujo = $this->txtIdFlujo->Value;
      $idWorkflow = $this->txtIdWorkflow->Value;
      $idCache = $this->txtIdCache->Value;
      $idEmpresa = $this->txtIdEmpresa->Value;

      $arrCache = WfFlujo::obtenerCache($idWorkflow, $idCache);
      Utilidades::grabarSessionPorNombre(self::SESION_CACHE.$nombrePagina, $arrCache);

      $this->wucAprobacion->IdFlujo = $idFlujo;
      $this->wucAprobacion->IdWorkflow = $idWorkflow;
      $this->wucAprobacion->IdEmpresa = $idEmpresa;
      $this->wucAprobacion->IdPaso = $this->txtIdPaso->Value;
      $this->wucAprobacion->IdHistorial = $this->txtIdHistorial->Value;
      $this->wucAprobacion->IdCache = $idCache;
      $this->wucAprobacion->ArrayCache = $arrCache;

      if ($estado == "INGRESADO" || $estado == "MODIFICADO" || $estado == "ELIMINADO") {
        $cargarDesdePopUp = "1";
      }

      //agrega atributo a control
      $this->btnCrear->Attributes->Add("onclick", "return(validarFormularioOrdenTrabajo())");
      $this->btnAplicar->Attributes->Add("onclick", "return(validarFormularioOrdenTrabajo())");
      $this->btnAceptar->Attributes->Add("onclick", "return(validarFormularioOrdenTrabajo())");
      $this->btnEliminar->Attributes->Add("onclick", "return(validarEliminarOrdenTrabajo())");
      $this->btnImprimir->Attributes->Add("onclick", "return(imprimirOrdenTrabajo('".$idFlujo."'))");

      //inicializa los controles del Correlativo y Locales
      $this->inicializaControlesEventoWindowOnLoad($isPostBack);

      //verifica los permisos sobre los controles
      $this->verificarPermisos();
    } catch (Exception $e) {
      throw new Exception($e->getMessage());
    }
  }

  /**
   * inicializa los controles al cargar la pagina
   * @param <type> $isPostBack
   * @author VSR, 05/12/2011
   */
  private function inicializaControlesEventoWindowOnLoad($isPostBack) {
    $nombrePagina = $this->obtenerNombrePagina();
    $estado = Utilidades::isNull(Utilidades::obtenerSessionPorNombre("Estado" . $nombrePagina), "");
    $sb = new StringBuilder();
    $idFlujo = $this->txtIdFlujo->Value;

    if ($estado == "INGRESADO" || $estado == "MODIFICADO" || $estado == "") {
      $sb->appendLine("setTimeout(\"ocultarElemento('" . $this->pnlMensajeUsuario->ClientID . "')\", 5000);");
    }

    if($idFlujo == "0"){
      $sb->appendLine("removerClassColumnaWucAprobacion();");
    }

    $this->Page->ClientScript->registerEndScript("windowOnLoad", $sb->toString());
  }

  /**
   * verifica los permisos sobre los controles
   * @author VSR, 01/01/2011
   */
  private function verificarPermisos() {
    $paginaActual = Utilidades::obtenerNombrePaginaActual($this);
    $idFlujo = $this->txtIdFlujo->Value;

    //verifica los permisos para los controles
    $this->pnlContenido->Visible = Utilidades::tienePermiso($paginaActual, self::FUNCION_VER);
    $this->hBotonCrear->Visible = Utilidades::tienePermiso($paginaActual, self::FUNCION_VER) && $idFlujo == "0" && Utilidades::tienePermiso($paginaActual, self::FUNCION_CREAR);
    $this->hBotonEliminar->Visible = Utilidades::tienePermiso($paginaActual, self::FUNCION_VER) && $idFlujo != "0" && Utilidades::tienePermiso($paginaActual, self::FUNCION_ELIMINAR);
    $this->hBotonReplicar->Visible = Utilidades::tienePermiso($paginaActual, self::FUNCION_VER) && $idFlujo != "0" && Utilidades::tienePermiso($paginaActual, self::FUNCION_REPLICAR_DATOS);

    if (!$this->pnlContenido->Visible) {
      $this->pnlMensajeAcceso->Visible = true;
      Utilidades::setPanelMensajeUsuario($this->pnlMensajeAcceso, "No tiene permiso para ver esta p&aacute;gina", "50%", Utilidades::ESTILO_MENSAJE_ERROR);
    }
  }

  /**
   * muestra mensaje al usuario
   * @author VSR, 05/12/2011
   */
  private function mostrarMensajeUsuario() {
    try {
      $mensaje = Utilidades::isNull(Utilidades::obtenerSessionPorNombre("msg"), "");
      $baseUrl = $this->Page->Theme->BaseUrl;

      //asigna mensaje al panel
      $this->pnlMensajeUsuario->Visible = true;

      //dependiendo de la marca especial que tenga el sistema es como se muestra el mensaje al usuario
      if (strpos($mensaje, "{#INGRESADO}") === 0) {
        $mensaje = str_replace("{#INGRESADO}", "", $mensaje);
        Utilidades::setPanelMensajeUsuarioConBotonCerrar($this->pnlMensajeUsuario, $mensaje, "100%", Utilidades::ESTILO_MENSAJE_EXITO, $baseUrl);
      } elseif (strpos($mensaje, "{#MODIFICADO}") === 0) {
        $mensaje = str_replace("{#MODIFICADO}", "", $mensaje);
        Utilidades::setPanelMensajeUsuarioConBotonCerrar($this->pnlMensajeUsuario, $mensaje, "100%", Utilidades::ESTILO_MENSAJE_EXITO, $baseUrl);
      } elseif (strpos($mensaje, "{#ELIMINADO}") === 0) {
        $mensaje = str_replace("{#ELIMINADO}", "", $mensaje);
        Utilidades::setPanelMensajeUsuarioConBotonCerrar($this->pnlMensajeUsuario, $mensaje, "100%", Utilidades::ESTILO_MENSAJE_EXITO, $baseUrl);
      } elseif (strpos($mensaje, "{#DUPLICADO}") === 0) {
        $mensaje = str_replace("{#DUPLICADO}", "", $mensaje);
        Utilidades::setPanelMensajeUsuario($this->pnlMensajeUsuario, $mensaje, "100%", Utilidades::ESTILO_MENSAJE_ERROR);
      } elseif (strpos($mensaje, "{#ERROR}") === 0) {
        $mensaje = str_replace("{#ERROR}", "", $mensaje);
        Utilidades::setPanelMensajeUsuario($this->pnlMensajeUsuario, $mensaje, "100%", Utilidades::ESTILO_MENSAJE_ERROR);
      } else {
        $this->pnlMensajeUsuario->Visible = false;
      }
      Utilidades::grabarSessionPorNombre("msg", "");
    } catch (Exception $e) {
      $this->pnlMensajeUsuario->Visible = false;
    }
  }

  /**
   * obtiene nombre de la pagina actual
   * @return <type>
   * @author VSR, 05/12/2011
   */
  private function obtenerNombrePagina() {
    $nombrePagina = Utilidades::obtenerNombrePaginaActual($this);
    return $nombrePagina;
  }

  /**
   * graba los datos de la plantilla
   * @author VSR, 05/12/2011
   */
  private function grabar($accion) {
    try {
      $nombrePagina = Utilidades::obtenerNombrePaginaActual($this);
      $idFlujo = $this->txtIdFlujo->Value;
      $idWorkflow = $this->txtIdWorkflow->Value;
      $idEmpresa = $this->txtIdEmpresa->Value;
      $idPaso = $this->txtIdPaso->Value;
      $idCache = $this->txtIdCache->Value;
      $idHistorial = $this->txtIdHistorial->Value;
      $cargarFiltrosSesion = $this->txtCargarFiltrosSesion->Value;
      $paginaFiltro = $this->txtPaginaFiltro->Value;
      $status = "";
      $textoMensaje = "";
      $grabadoConExito = true;
      $queryStringPagina = "";

      //grabar valores
      $textoMensaje .= $this->grabarDatos($status, $idFlujo);
      if ($this->wucArchivo->Visible) { $textoMensaje .= $this->wucArchivo->grabar($idFlujo, WfFlujo::NOMBRE_ENTIDAD); }

      if ($status == "ingresado" && $idFlujo > 0) {
        $this->enviarEmailPrimerPaso($idFlujo);
      }

      if ($textoMensaje != "") {
        $grabadoConExito = false;
      } else {
        $grabadoConExito = true;
      }

      //muestra mensaje dependiendo si se grabo o no
      if ($grabadoConExito) {
        switch ($status) {
          case "ingresado":
            $textoMensaje = "{#INGRESADO}El flujo fue ingresado satisfactoriamente.<br />";
            Utilidades::grabarSessionPorNombre("Estado" . $nombrePagina, "INGRESADO");
            break;
          case "modificado":
            $textoMensaje = "{#MODIFICADO}El flujo fue actualizado satisfactoriamente.<br />";
            Utilidades::grabarSessionPorNombre("Estado" . $nombrePagina, "MODIFICADO");
            break;
          case "duplicado":
            $textoMensaje = "{#DUPLICADO}El flujo ya existe. Ingrese otro por favor.<br />";
            Utilidades::grabarSessionPorNombre("Estado" . $nombrePagina, "DUPLICADO");
            break;
          case "error":
            $textoMensaje = "{#ERROR}Se produjo un error interno y no se pudo ingresar el flujo. Intente nuevamente por favor.<br />";
            Utilidades::grabarSessionPorNombre("Estado" . $nombrePagina, "ERROR");
            break;
          default:
            break;
        }
      } else {
        $status = "error";
        $textoMensaje = "{#ERROR}".$textoMensaje;
        Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "ERROR");
      }

      //si hubo error en la pagina o se modifico entonces regresa a la misma, sino se devuelve al home
      if ($status == "error" || ($status == "modificado" && $accion == Sistema::APLICAR)) {
        //construye queryString
        $queryString = Utilidades::obtenerQueryStringFlujo(Utilidades::QUERYSTRING_FLUJO_NORMAL, "", $idFlujo, $idWorkflow, $idEmpresa, $idPaso, $idCache, $idHistorial,"0",$cargarFiltrosSesion,$paginaFiltro);

        Utilidades::grabarSessionPorNombre("msg", $textoMensaje);
        //construye query string con los valores correspondientes
        $this->Response->redirect("index.php?page=".$nombrePagina."&a=".$queryString);
      } elseif ($status == "modificado" && $accion == Sistema::ACEPTAR ) {
        $cargarFiltrosSesion = $this->txtCargarFiltrosSesion->Value;
        $paginaFiltro = (Utilidades::isNullOrEmpty($this->txtPaginaFiltro->Value)) ? "Workflow.Home" : $this->txtPaginaFiltro->Value;
        Utilidades::grabarSessionPorNombre(Utilidades::SESION_CARGAR_FILTROS_SESION, $cargarFiltrosSesion);
        $this->Response->redirect($this->Service->constructUrl($paginaFiltro));
      } else {
        Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "");
        Utilidades::grabarSessionPorNombre("msg", "");
        $this->Response->redirect($this->Service->constructUrl("Workflow.Home"));
      }

    } catch (Exception $e) {
      throw new Exception($e->getMessage());
    }
  }

  /**
   * graba o actualiza los datos de la planilla
   * @param <type> $status
   * @param <type> $idFlujo
   * @return string
   * @author VSR, 05/12/2011
   */
  private function grabarDatos(&$status, &$idFlujo) {
    $msgError = "";
    try {
      $idWorkflow = $this->txtIdWorkflow->Value;
      $strNombreWorkflow = $this->txtNombreWorkflow->Value;
      $idEmpresa = $this->txtIdEmpresa->Value;
      $strDepartamento = $this->ddlDepartamento->obtenerSelectedValue();
      $strTipoOrden = $this->ddlTipoOrden->obtenerSelectedValue();
      $strFechaLlamado = $this->txtFechaLlamado->Text;
      $strDescripcion = $this->txtDescripcion->Text;
      $strNombrePersona = $this->txtNombre->Text;
      $strDireccion = $this->txtDireccion->Text;
      $strTelefono = $this->txtTelefono->Text;
      $strObservacion = $this->txtObservacion->Text;
      $strNombreAsignado = $this->txtNombreAsignado->Text;
      $strPaternoAsignado = $this->txtPaternoAsignado->Text;
      $strMaternoAsignado = $this->txtMaternoAsignado->Text;
      $strFechaServicio = $this->txtFechaServicio->Text;
      $strHoraServicio = $this->wucHora->obtenerSelectedValueHora();
      $strMinutosServicio = $this->wucHora->obtenerSelectedValueMinutos();
      $idEstado = $this->ddlEstado->obtenerSelectedValue();
      $idFlujoPadre = $this->txtIdFlujoPadre->Value;
      $replicarDatos = $this->txtReplicarDatos->Value;
      $idArchivo1 = $this->txtIdArchivo1->Value;
      $strNombre = $strNombreWorkflow.": Cliente ".$strNombrePersona." [".$strFechaLlamado."]";

      //formatea valores
      $idEstado = ($idFlujo == "0") ? "-1" : $idEstado;
      $strHoraServicio = $strHoraServicio.":".$strMinutosServicio;
      $oUsuarioWf = Utilidades::obtenerSessionPorNombre(Usuario::NOMBRE_ENTIDAD);
      $idUsuario = $oUsuarioWf->getId();

      //graba los datos del flujo
      if ($idFlujo == "0") {
        $arr = WfFlujo::grabarDatos($idFlujo, $idWorkflow, $idEmpresa, $idUsuario, WfFlujoEstado::ESTADO_PENDIENTE, $strNombre, $replicarDatos, $idFlujoPadre);
        if (is_null($arr)) {
          throw new Exception("Error al ejecutar WfFlujo::grabarDatos");
        } else {
          $idFlujo = $arr[0]["IdFlujo"];
          $status = $arr[0]["Status"];
          if ($status == "duplicado") {
            $idFlujo = "0";
          }
        }
      } else {
        $status = "modificado";
      }

      //graba los datos de la orden trabajo
      if ($idFlujo != "0") {
        $arr = WfPlantillaOrdenTrabajo::grabarDatos($idFlujo, $status, $idUsuario, $strDepartamento,$strTipoOrden,$strFechaLlamado,$strDescripcion,
                                                    $strNombrePersona,$strDireccion,$strTelefono,$strObservacion,$strNombreAsignado,$strPaternoAsignado,
                                                    $strMaternoAsignado,$strFechaServicio,$strHoraServicio,$idEstado);
        if (is_null($arr)) {
          throw new Exception("Error al ejecutar WfPlantillaOrdenTrabajo::grabarDatos");
        }
        //graba los archivos
        if($status == "ingresado" || $status == "modificado") {
          if($replicarDatos == "1") {
            if($this->fuArchivo1->HasFile){
              Utilidades::grabarArchivoFileUpload($this->fuArchivo1, $idFlujo, WfPlantillaOrdenTrabajo::NOMBRE_ENTIDAD_ARCHIVO);
            } else {
              if($idArchivo1 != "0") { Utilidades::replicarArchivo($idArchivo1, $idFlujo, $idFlujoPadre, WfPlantillaOrdenTrabajo::NOMBRE_ENTIDAD_ARCHIVO); }
            }
          } else {
            if ($this->fuArchivo1->HasFile) {Utilidades::grabarArchivoFileUpload($this->fuArchivo1, $idFlujo, WfPlantillaOrdenTrabajo::NOMBRE_ENTIDAD_ARCHIVO);}
          }
        }
      }
    } catch (Exception $e) {
      $msgError = "Se produjo un error interno, no se pudo grabar el flujo.<br/>";
      $idFlujo = ($idFlujo > 0) ? $idFlujo : "0";
      $status = "error";
    }
    return $msgError;
  }

  /**
   * elimina los datos de la orden trabajo
   * @param <type> $status
   * @param <type> $idFlujo
   * @return string
   * @author VSR, 05/12/2011
   */
  private function eliminar(&$status, $idFlujo, $idUsuario) {
    $msgError = "";

    try {
      $status = WfFlujo::eliminacionLogica($idFlujo, $idUsuario);

      $idArchivo1 = $this->txtIdArchivo1->Value;
      $entidad = WfPlantillaOrdenTrabajo::NOMBRE_ENTIDAD_ARCHIVO;
      $statusArchivo = Archivo::eliminarArchivoEnBDPorId($idArchivo1);

      if($statusArchivo > 0){
        $directorioArchivoRepositorio = Archivo::RUTA_REPOSITORIO."/".$entidad."/reg".$idFlujo;
        //elimina el archivo temporal del repositorio
        Archivo::eliminarDirectorio($directorioArchivoRepositorio);
      }
    } catch (Exception $e) {
      $msgError = "Se produjo un error interno, no se pudo eliminar la plantilla.<br/>" . $e->getMessage();
    }
    //retorna valor
    return $msgError;
  }

  /**
   * ingresa el primer registro para el paso 1 y envia mail de notificacion si asi esta configurado
   * @param <type> $pasosJSON
   */
  private function enviarEmailPrimerPaso($idFlujo) {
    $idHistorial = 0;
    try {
      $nombrePagina = Utilidades::obtenerNombrePaginaActual($this);
      $arr = Utilidades::obtenerSessionPorNombre(self::SESION_CACHE.$nombrePagina);

      //obtiene arreglo de los pasos
      $ordenPasoProximaAccion = "1";
      $idWorkflow = $this->txtIdWorkflow->Value;
      $strNombreWorkflow = $this->txtNombreWorkflow->Value;
      $idEmpresa = $this->txtIdEmpresa->Value;
      $idCache = $this->txtIdCache->Value;
      $esEncargado = $this->txtEsEncargado->Value;
      $arrPasos = $arr[WfFlujo::ARRAY_PASO_LISTADO];
      $arrPasoActual = Utilidades::arrayRowFilter($arrPasos, "OrdenPaso == '".$ordenPasoProximaAccion."'");
      $idPaso = $arrPasoActual[0]["IdPaso"];
      $strObservacion = "";
      $idFlujoEstado = WfFlujoEstado::ESTADO_PENDIENTE;
      $idPasoEstado = WfPasoEstado::ESTADO_PENDIENTE;
      $idAprobador = "-1";

      $idHistorial = WfFlujo::grabarHistorial($strObservacion, $idFlujo, $idFlujoEstado, $idPasoEstado, $idPaso, $idAprobador);
      if ($idHistorial == Sistema::CODIGO_SQL_ERROR) {
        throw new Exception("No se pudo grabar el historial");
      } else {
        //obtiene nombre flujo
        $strFechaLlamado = $this->txtFechaLlamado->Text;
        $strNombrePersona = $this->txtNombre->Text;
        $strNombre = $strNombreWorkflow.": Cliente ".$strNombrePersona." [".$strFechaLlamado."]";
        Utilidades::enviarEmailPorOrdenPaso($nombrePagina, $arr, $arrPasos, $ordenPasoProximaAccion, $idWorkflow, $idEmpresa, $strNombre, $idPasoEstado, $idFlujo, $this->Service, $this->Application, $idCache, $idHistorial);
      }
    } catch (Exception $e) {
      //no hace nada
    }
  }

  /**
   * deja toda la plantilla como solo lectura
   * @author VSR, 28/05/2012
   */
  private function convertirPlantillaSoloLectura(){
    try {
      //controles generales
      $this->pnlWucArchivo->Visible = false;
      $this->hBotonImprimir->Visible = false;
      $this->hBotonEliminar->Visible = false;
      $this->hBotonAplicar->Visible = false;
      $this->hBotonAceptar->Visible = false;
      $this->hBotonCrear->Visible = false;
      $this->hBotonReplicar->Visible = false;
      //controles de la plantilla
      $this->ddlDepartamento->Enabled = false;
      $this->ddlTipoOrden->Enabled = false;
      $this->txtFechaLlamado->Enabled = false;
      $this->txtDescripcion->Enabled = false;
      $this->txtNombre->Enabled = false;
      $this->txtDireccion->Enabled = false;
      $this->txtTelefono->Enabled = false;
      $this->txtObservacion->Enabled = false;
      $this->txtNombreAsignado->Enabled = false;
      $this->txtPaternoAsignado->Enabled = false;
      $this->txtMaternoAsignado->Enabled = false;
      $this->txtFechaServicio->Enabled = false;
      $this->wucHora->Enabled = false;
      $this->ddlEstado->Enabled = false;
      $this->pnlAdjuntarArchivos->Enabled = false;
    } catch (Exception $e) {
      //no hace nada
    }
  }

//</editor-fold>

//<editor-fold defaultstate="collapsed" desc="Eventos Controles">
  public function onLoad($param) {
    parent::onLoad($param);
    try {
      $argCrypt = $this->Request["a"];
      $textoDesencriptado = Criptografia::desencriptar($argCrypt);
      $this->txtThemeBaseUrl->Value = $this->Page->Theme->BaseUrl;

      if (!$this->Page->IsPostBack) {
        if(!Utilidades::isNullOrEmpty($argCrypt)) {
          $arr = json_decode($textoDesencriptado);
          //obtiene los datos
          $idWorkflow = $arr->IdWorkflow;
          $idEmpresa = $arr->IdEmpresa;
          $idFlujo = $arr->IdFlujo;
          $idPaso = $arr->IdPaso;
          $idCache = $arr->IdCache;
          $idHistorial = $arr->IdHistorial;
          $replicarDatos = $arr->ReplicarDatos;
          $cargarFiltrosSesion = $arr->CargarFiltrosSesion;
          $paginaFiltro = $arr->PaginaFiltro;
          $this->txtIdWorkflow->Value = $idWorkflow;
          $this->txtIdEmpresa->Value = $idEmpresa;
          $this->txtIdFlujo->Value = $idFlujo;
          $this->txtIdFlujoPadre->Value = $idFlujo;
          $this->txtIdPaso->Value = $idPaso;
          $this->txtIdCache->Value = $idCache;
          $this->txtIdHistorial->Value = $idHistorial;
          $this->txtReplicarDatos->Value = $replicarDatos;
          $this->txtCargarFiltrosSesion->Value = $cargarFiltrosSesion;
          $this->txtPaginaFiltro->Value = $paginaFiltro;
          $this->pnlMensajeAcceso->Visible = false;
          $this->pnlContenido->Visible = true;
          $this->obtenerDatos();

          if($replicarDatos == "1") { $this->txtIdFlujo->Value = "0"; }
          $this->inicializaControles($this->IsPostBack);
          $this->actualizaInterfaz();
          $this->mostrarMensajeUsuario();
        } else {
          $this->hBotonCrear->Visible = false;
          $this->hBotonAplicar->Visible = false;
          $this->hBotonAceptar->Visible = false;
          $this->hBotonEliminar->Visible = false;
          $this->pnlContenido->Visible = false;
          $this->pnlMensajeAcceso->Visible = true;
          Utilidades::setPanelMensajeUsuario($this->pnlMensajeAcceso, "El argumento recibido no es v&aacute;lido", "50%", Utilidades::ESTILO_MENSAJE_ERROR);
        }
      }
    } catch (Exception $e) {
      $this->hBotonCrear->Visible = false;
      $this->hBotonAplicar->Visible = false;
      $this->hBotonAceptar->Visible = false;
      $this->hBotonEliminar->Visible = false;
      $this->pnlContenido->Visible = false;
      $this->pnlMensajeAcceso->Visible = true;
      Utilidades::setPanelMensajeUsuario($this->pnlMensajeAcceso, "El argumento recibido no es v&aacute;lido", "50%", Utilidades::ESTILO_MENSAJE_ERROR);
    }

  }

  public function btnCrearClick($sender, $param) {
    $this->grabar(Sistema::APLICAR);
  }

  public function btnAplicarClick($sender, $param){
    $this->grabar(Sistema::APLICAR);
  }

  public function btnAceptarClick($sender, $param){
    $this->grabar(Sistema::ACEPTAR);
  }

  public function btnEliminarClick($sender, $param) {
    $oUsuarioWf = Utilidades::obtenerSessionPorNombre(Usuario::NOMBRE_ENTIDAD);
    $idFlujo = $this->txtIdFlujo->Value;
    $idWorkflow = $this->txtIdWorkflow->Value;
    $idEmpresa = $this->txtIdEmpresa->Value;
    $idPaso = $this->txtIdPaso->Value;
    $idCache = $this->txtIdCache->Value;
    $idHistorial = $this->txtIdHistorial->Value;
    $cargarFiltrosSesion = $this->txtCargarFiltrosSesion->Value;
    $paginaFiltro = $this->txtPaginaFiltro->Value;
    $status = "";
    $textoMensaje = "";
    $eliminadoConExito = true;
    $queryString = "";

    try {
      $idUsuario = $oUsuarioWf->getId();
      $nombrePagina = Utilidades::obtenerNombrePaginaActual($this);
      //elimina la pagina
      $textoMensaje .= $this->eliminar($status, $idFlujo, $idUsuario);

      if ($textoMensaje != "") {
        $eliminadoConExito = false;
      } else {
        $eliminadoConExito = true;
      }

      //muestra mensaje dependiendo si se grabo o no
      if ($eliminadoConExito) {
        switch ($status) {
          case "eliminado":
            $textoMensaje = "{#ELIMINADO}El flujo fue eliminado satisfactoriamente. Complete el formulario para ingresar uno nuevo.<br />";
            Utilidades::grabarSessionPorNombre("Estado" . $nombrePagina, "ELIMINADO");
            break;
          case "error":
            $textoMensaje = "{#ERROR}Se produjo un error interno y no se pudo eliminar el flujo. Intente nuevamente por favor.<br />";
            Utilidades::grabarSessionPorNombre("Estado" . $nombrePagina, "ERROR");
            break;
        }
      } else {
        $textoMensaje = "{#ERROR}" . $textoMensaje;
        Utilidades::grabarSessionPorNombre("Estado" . $nombrePagina, "ERROR");
      }

      Utilidades::grabarSessionPorNombre("msg", $textoMensaje);
      //construye query string con los valores correspondientes
      $idFlujo = ($status == "eliminado") ? "0" : $idFlujo;
      $idPaso = ($status == "eliminado") ? "0" : $idPaso;
      $queryString = Utilidades::obtenerQueryStringFlujo(Utilidades::QUERYSTRING_FLUJO_NORMAL, "", $idFlujo, $idWorkflow, $idEmpresa, $idPaso, $idCache, $idHistorial,"0",$cargarFiltrosSesion,$paginaFiltro);

      $this->Response->redirect("index.php?page=" . $nombrePagina . "&a=" . $queryString);
    } catch (Exception $e) {
      throw new Exception($e->getMessage());
    }
  }

  public function btnVolverClick($sender, $param) {
    $cargarFiltrosSesion = $this->txtCargarFiltrosSesion->Value;
    $paginaFiltro = (Utilidades::isNullOrEmpty($this->txtPaginaFiltro->Value)) ? "Workflow.Home" : $this->txtPaginaFiltro->Value;
    Utilidades::grabarSessionPorNombre(Utilidades::SESION_CARGAR_FILTROS_SESION, $cargarFiltrosSesion);

    $this->Response->redirect($this->Service->constructUrl($paginaFiltro));
  }

//</editor-fold>
}

?>
